home *** CD-ROM | disk | FTP | other *** search
/ Aminet 5 / Aminet 5 - March 1995.iso / Aminet / misc / amag / AM9401_2.lha / Amiga0194b / Blitz-Basic / listing1.asc next >
Text File  |  1994-02-28  |  3KB  |  114 lines

  1. ;
  2. ; IsoRender.bb by Simon Armstrong
  3. ;
  4.  
  5. NEWTYPE .balltype ;alle Felder sind .q (schnelle 32-Bit Festkommazahl)
  6.   depth.q ;wird benoetigt um Liste rueckwaerts zu sortieren
  7.   col     ;Farbe der Kugel (s Tabelle)
  8.   x:y:z   ;3D Position der Kugel
  9.   sx:sy   ;Position der Kugel nach Iso-Projection
  10. End NEWTYPE
  11.  
  12. Dim List ball.balltype(50)
  13.  
  14. LoadShapes 4,"balls.shapes" ;muss im Iso-Verzeichnis sein (CD)
  15. LoadPalette 0,"balls.iff"   ;Palette aus IFF-Datei laden
  16.  
  17. Screen 0,27,"ISOMETRIC SHAPE GENERATOR" ;Hires Lace Screen oeffnen
  18. Use Palette 0
  19. ScreensBitMap 0,0
  20.  
  21. Box 15,15,15+33,15+41,1 ;Shape muss in diesen Rahmen passen
  22. GetaShape 0,16,15,32,1  ;um Hoehe zu begrenzen
  23.  
  24. For r=0 To 15
  25.   Restore myshape:f=16+r:Gosub makeframe:Blit f,r*40+16,104
  26.   Restore mozzy:f=32+r:Gosub makeframe:Blit f,r*40+16,144
  27.   Restore blade:f=48+r:Gosub makeframe:Blit f,r*40+16,184
  28. Next
  29.  
  30. SaveShapes 16,f,"isoshapes" ;alle erzeugten Shapes speichern
  31. MouseWait
  32. End
  33.  
  34. ; Die folgende Routine liest die Daten fuer die Kugeln ein,
  35. ; speichert sie in der Liste, dreht sie um die Z-Achse,
  36. ; sortiert, projiziert, zeichnet sie und beschneidet 
  37. ; die Umrandung.
  38.  
  39. .makeframe:
  40.   Read n            ;Anzahl der Kugeln?
  41.   rsin=Sin(r*Pi/8)  ;noetig fuer folgende 2D-Rotation
  42.   rcos=Cos(r*Pi/8)
  43.   ClearList ball()  ;Liste ausleeren
  44.   USEPATH ball()    ;spart Tipparbeit (50 mal ball())!
  45.  
  46.   For b=0 To n-1
  47.     AddItem ball()      ;Kugel in Liste einlesen
  48.     Read \col,tx,ty,\z
  49.     \x=tx*rsin+ty*rcos  ;mit 2D-Matrix rotieren
  50.     \y=tx*rcos-ty*rsin
  51.     \depth=\x+\y        ;Tiefe berechnen fuer Sortierung
  52.   Next
  53.  
  54.   Boxf 16,16,16+31,16+39,0  ;Rahmen freimachen zum Zeichnen
  55.   SortList ball()           ;Rueckwaerts sortieren
  56.   ResetList ball()          ;Mit der letzten Kugel anfangen
  57.   While NextItem(ball())
  58.     \sx=32+(\x-\y) ASL 4    ;Bildschirmposition berechnen
  59.     \sy=48+(\x+\y-\z) ASL 3
  60.     Blit \col,x+\sx,y+\sy   ;und zeichnen
  61.   Wend
  62.  
  63.   ; Der folgende Abschnitt beschneidet die Umrandung, 
  64.   ; sodass die kleinstmoegliche Flaeche fuer die Shape 
  65.   ; verwendet wird.
  66.  
  67.   y0=16:While BlitColl(0,16,y0)=0:Blit 0,16,y0:y0+1:Wend
  68.   y1=16+39:While BlitColl(0,16,y1)=0:Blit 0,16,y1:y1-1:Wend
  69.   GetaShape f,16,y0,32,y1-y0+1
  70.   Handle f,16,36+16-y0
  71.   Return
  72.  
  73. ; Es folgen die Daten fuer die Shapes, freigegeben fuer
  74. ; Veraenderungen. Es sollten keine Werte groesser als 2 
  75. ; fuer die xyz-Koordinaten verwendet werden.
  76. ; Format:
  77. ; AnzahlKugeln
  78. ;   ShapeNummer,x,y,z
  79. ;   ShapeNummer,x,y,z etc.
  80.  
  81.  
  82. .myshape:
  83.   Data 14
  84.   Data 8,-.2,-.3,0    ;Fuesse
  85.   Data 8,-.2,0.3,0
  86.   Data 8,0.2,-.3,0
  87.   Data 8,0.2,0.3,0
  88.   Data 6,0,0,1        ;Koerper
  89.   Data 5,0,0,2.5      ;Kopf
  90.   Data 7,.4,-.2,2.5   ;Augen
  91.   Data 7,.4,0.2,2.5
  92.   Data 9,0,-.4,1      ;Arme
  93.   Data 9,0,0.4,1
  94.   Data 9,.2,-.4,1
  95.   Data 9,.2,0.4,1
  96.   Data 9,.4,-.4,1
  97.   Data 9,.4,0.4,1
  98.  
  99. .mozzy
  100.   Data 5
  101.   Data 4,0,0,1        ;Koerper
  102.   Data 7,-.4,0,1
  103.   Data 7,-.6,0,1
  104.   Data 8,.4,.2,1
  105.   Data 8,.4,-.2,1
  106.  
  107. .blade
  108.   Data 5
  109.   Data 9,0,-.6,1.8
  110.   Data 8,0,-.3,1.8
  111.   Data 7,0,0,1.8
  112.   Data 8,0,.3,1.8
  113.   Data 9,0,.6,1.8
  114.